package com.ds.seqlist.LeetCode;

public class Num203_RemoveLinkedListElement {
    //    public ListNode removeElements(ListNode head, int val) {
//        while (head != null && head.val == val) {
//            // 做题无需关系内存释放问题
//            head = head.next;
//        }
//        if (head == null) {
//            return null;
//        }else {
//            ListNode prev = head;
//            while (prev.next != null) {
//                if (prev.next.val == val) {
//                    ListNode node = prev.next;
//                    prev.next = node.next;
//                }else {
//                    prev = prev.next;
//                }
//            }
//            return head;
//        }
//    }

    /**
     * 虚拟头节点法
     * @param head
     * @param val
     * @return
     */
//    public ListNode removeElements(ListNode head, int val) {
//        ListNode dummyHead = new ListNode();
//        // 记得链接原链表
//        dummyHead.next = head;
//        ListNode prev = dummyHead;
//        while (prev.next != null) {
//            if (prev.next.val == val) {
//                prev.next = prev.next.next;
//            }else {
//                prev = prev.next;
//            }
//        }
//        return dummyHead.next;
//    }

    /**
     * 传入一个以head为头结点的链表，就能删除所有值为val的节点
     * 返回删除后的链表头节点
     * @param head
     * @param val
     * @return
     */
    public ListNode removeElements(ListNode head, int val) {
        // 1.边界
        if (head == null) {
            return null;
        }
        // 删除所有值为val的节点后，子链表的头节点可能会发生变化
        // 更新第二个节点的引用
        head.next = removeElements(head.next,val);
//        if (head.val == val) {
//            return head.next;
//        }
//        return head;
        return head.val == val ? head.next : head;
    }

}
